/**
 * 
 */
package hb_Teach_InitObject_InterFaceTest;

import org.junit.Test;

/**
 * @author Jiang Zhiyan
 *
 * 2021年4月30日 下午3:53:18
 */
public class InterFaceTest {
	@Test
    public void test01() {
    	InterfaceA ia = new Foo();
    	ia.abstractMethodA();
    	
    	InterfaceB ib = new Foo();
//    	实例（类）方法，静态方法调用的区别
    	ib.abstractMethodB();
    	InterfaceB.staticMethod();
    }
} 
/**
 * 1.接口中只能声明常量，默认使用 public　static final 修饰
 * 2.jdk7.x之前，接口中只能声明抽象方法默认使用Public abstract
 * 3.jdk7.x之后，可以声明静态方法
 */
interface InterfaceA{
	double PI=3.14;
	void abstractMethodA();
}
/**
 * @FunctionalInterface 标注一个接口是否为函数式接口，在lamada表达式中使用
 * 
 * 函数式接口：接口中
 */
@FunctionalInterface
interface InterfaceB{
	void abstractMethodB();
//	private 不可声明静态方法，常用pubic /protected
	public static void staticMethod() {
		System.out.println("静态方法在jdk8以后可以声明在接口中");
	}
//	如果不用default关键字，则默认为abstract方法
//   且接口中默认方法，必须使用default关键字	
	public default void defaultMethod() {
		privateMethod();
		System.out.println("default方法在jdk8以后可以声明在接口中");
	}
	private void privateMethod() {
		System.out.println("private方法在jdk8以后可以声明在接口中");
	}
}
//接口只能继承接口，而且可以继承多个接口
interface InterfaceC extends InterfaceA,InterfaceB{
	
}
/**
 * 类实现接口
 * 
 * 1.类实现接口，必须实现接口中的所有抽象方法
 * 2.类可以同时实现多个接口
 * 3.接口不能实例化
 */

class Foo implements InterfaceA,InterfaceB{
	@Override
	public void abstractMethodA() {
		System.out.println("Foo#abstractMethodA的实现");
	}

	@Override
	public void abstractMethodB() {
		// TODO Auto-generated method stub
		System.out.println("Foo#abstractMethodB的实现");
	}
	
}